home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
amok_lha
/
amok24.lha
/
TurboFiles
/
TurboFiles.dok
< prev
next >
Wrap
Text File
|
1993-08-15
|
9KB
|
170 lines
TurboFiles.dok
~~~~~~~~~~~~~~
TurboFiles ist ein Ersatz für das FileSystem von AM-Soft.
Ich habe die wichtigsten Prozeduren in Assembler übersetzt ( zu
erkennen an der Vorsilbe Turbo im Prozedurnamen), so daß sich
gegenüber FileSysten eine deutliche Geschwindigkeitssteigerung ergibt.
Dieses Modul beschleunigt das Lesen und Schreiben von Dateien.
Wenn man von einer Datei die Daten in sehr kleinen Portionen liest
oder hineinschreibt, ist die Benutzung von Dos recht langsam.
Deshalb verwendet TurboFiles (wie FileSystem) einen Puffer. Daher
müssen die DOS-Funktionen nur selten aufgerufen werden.
Ein weiterer Vorteil von TurboFiles ist, daß geöffnete Files im
Falle eines Programmabruches automatisch vervollständigt und
geschlossen werden.
Die Benutzung von TurboFiles ist der von FileSystem sehr ähnlich.
Wer schon mit FileSystem gearbeitet hat, sollte deshalb mit
TurboFiles keine Schwierigkeiten haben.
Falls Sie FileSystem noch nicht kennen, sollten Sie es sich vielleicht
als erstes einmal ansehen, da ich in diesem Text eventuell
unbewußt einige dort beschriebene Dinge vorraussetze.
Ich habe die einzelnen Prozeduren im Definitionsmodul (das Sie
sich ausdrucken sollten) ausführlich beschrieben, daher werde ich mich
im folgenden etwas kürzer fassen.
Lookup(VAR f:FilePtr;VAR name:ARRAY OF CHAR;bufferSize:CARDINAL;
mode:AccesMode):TurboResult;
Jede Datei wird mit einer strukturierten Variablen von Typ File
identifiziert. Lookup gibt einen Zeiger auf diese File-Variable
zurück. Dieser Zeiger wird dann für alle folgenden Dateioperationen
benutzt. Die komponenten der File-Variable dürfen nicht
verändert werden. Das einzige Feld, das Sie benutzen sollten,
ist file^.res . Dieses Feld gibt Auskumft über den Status der
Datei und hat normalerweise den Wert done.
Die Prozedur Lookup öffnet das File und initialisiert
den Puffer. Außer DeleteFile() und Code() dürfen auf eine Datei keinerlei
Operationen ausgeführt werden, bevor die Datei nicht erfolgreich
geöffnet worden ist. name ist der Name der zu öffnenden Datei,
bufferSize bestimmt die Grösse des benutzten Puffers. Um eine
optimale Puffergröße zu finden, kann man das Programm SpeedCheck
verwenden. Wenn man von der Datei im Durchschnitt n Bytes liest,
so sollte der Puffer in der Größenordnung von 50*n bis 200*n liegen.
mode kann die Werte ReadOnly, ReadWrite oder NewFile haben.
Ist mode=ReadWrite, so kann man in die Datei abwechselnd schreiben
oder aus ihr lesen. NewFile legt eine neue Datei an (oder löscht eine
bestehende Datei dieses Namens) in die man dann Schreiben und aus der
man auch lesen kann.
Ist mode=ReadOnly, so kann man aus der Datei nur lesen. Der Vorteil
dieses Modus ist, daß man die Datei nicht verändern kann und daß
deshalb gleichzeitig andere Programme lesend auf diese Datei zu-
greifen können. Konnte die Datei geöffnet werden, wird der Wert
done als Resultat zurückgegeben und f zeigt fortan auf eine Variable
von Typ File, welche für (fast) alle weiteren Operationen benötigt wird.
CloseFile(VAR f:FilePtr);
Schließt die Datei wieder und gibt den für den Puffer belegten
Speicherbereich wieder frei. f bekommt den Wert NIL. Obwohl alle
geöffneten Dateien bein beenden des Programmes automatisch geschlossen
werden, und deshalb das explizite Schliessen der Dateien überflüssig
erscheinen mag, empfehle ich doch, die Dateien zu schliessen, sobald
man sie nicht mehr benötigt, damit andere Programme wieder auf diese
ungestört zugreifen können.
DeleteFile(VAR fileName:ARRAY OF CHAR):BOOLEAN;
Diese Prozedur ruft nur Dos.Delete auf um eine Datei zu löschen.
Achtung: Die Datei, die gelöscht werden soll, darf NICHT geöffnet sein.
Konnte die Datei gelöscht werden, so wird als Resultat TRUE zurückgegeben.
ReadBytes(f:FilePtr;adr:ADDRESS;len:LONGINT;VAR actual:LONGINT);
Diese Prozedur versucht, aus der durch f spezifizierten Datei len
Bytes zu lesen und speichert diese an der Stelle adr ab.
actual gibt an, wie viele Bytes gelesen werden konnten. Normalerweise
wird actual=len sein. Trat aber ein Fehler auf, z.B. daß die aktuelle
Position weniger als len Bytes von Dateiende entfernt ist, so wird
actual kleiner als len sein. Gleichzeitig wird f^.res einen Wert
ungleich done haben.
Man kann also wahlweise f^.res oder actual abfragen, um festzustellen
ob alle Daten erfolgreich gelesen worden sind.
Wird f^.res von irgendeiner Prozedur auf einen Wert ungleich done
gesetzt, so werden alle folgenden Prozeduraufrufe (außer CloseFile)
ignoriert. Man kann also z.B. ReadBytes mehrmals hintereinander aufrufen
und erst nach dem letzten Aufruf f^.res abfragen. Hat f^.res den Wert done,
so waren alle vorhergehenden Prozeduraufrufe erfolgreich, andernfalls
ist irgendwann ein Fehler aufgetreten.
Beispiel:Lesen einer Zahl x aus einer Datei:
VAR x:REAL;
act:LONGINT;
ReadBytes(offenesFile,ADR(x),SIZE(x),act);
IF act=SIZE(x) (* f^.res=done*) THEN
WriteString('OK')
ELSIF f^.res=endOfFile THEN
WriteString('Dateiende erreicht!')
ELSE
WriteString('Irgendein Fehler')
END;
WriteBytes(f:FilePtr;adr:ADDRESS,len:LONGINT);
Diese Prozedur schreibt die Variable, die an der Adresse adr steht und
len Bytes groß ist in die Datei. Ist f^.res#done, so ist ein
Fehler aufgetreten: Entweder ist die Diskette voll oder defekt.
Ist die Diskette voll, so erscheint ein Requester "Disk full...".
Dann kann man, nachden man einige unwichtige Files auf der Diskette
gelöscht hat, RETRY anklicken und ungestört fortfahren. Andernfalls
ist ein Teil der Datei verloren.
GetPos(f:FilePtr):LONGINT;
Gibt die momentane Position in der Datei zurück oder -1 falls
f^.res einen Wert ungleich done hat.
SetPos(f:FilePtr;offset:LONGINT;mode:SetPosMode):BOOLEAN;
Mit SetPos kann man die aktuelle Position innerhalb der Datei
frei bestimmen. Offset bestimmt die neue Position.
Ist mode=beginning, so wird offSet vom Anfang der Datei aus gemessen,
ist mode=end, so vom Ende der Datei aus. Ist mode=current, so
wird die aktuelle Position um offset verschoben; dabei verschiebt
ein positiver Wert die Position zum Dateiende, ein negativer zum
Dateianfang. Wird versucht, eine Position ausserhalb der Datei-
grenzen anzuwählen, so wird f^.res auf seekError gesetzt und
FALSE zurückgegeben.
FileLength(f:FilePtr):LONGINT;
Gibt die Länge der Datei in Bytes (oder -1 , falls f^.res#done) zurück.
Search(f:FilePtr;VAR str:ARRAY OF BYTE;len:LONGINT):LONGINT;
Sucht in der Datei ab der momentanen Position nach str, wobei
nur die ersten len Bytes von str berücksichtigt werden.
Wird str gefunden, so wird die aktuelle Position auf diese Stelle
gesetzt und diese Position wird zurückgegeben. Wird str nicht
gefunden, so wird -1 zurückgegeben und f^.res hat einen Wert
ungleich done.
Code(fileName,codeWord:ARRAY OF CHAR;decode:BOOLEAN):BOOLEAN;
Diese Prozedur dient zum Codieren von beliebigen Files.
Die Datei fileName darf NICHT geöffnet sein. codeWord ist
ein beliebiger String, der alle Zeichen bis auf 0C enthalten
darf und nicht länger als 256 Zeichen sein sollte. decode
gibt an ob die Datei codiert oder decodiert werden soll.
Man kann jede beliebige Datei codieren. Danach ist sie solange
unlesbar und unbrauchbar, bis sie wieder mit dem gleichen
Codewort decodiert worden ist. Die codierte Datei hat die selbe
Größe und den selben Namen wie das Original, d.h. das
Original wird überschrieben!
Die Prozeduren TurboRead, TurboWrite, TurboSetPos, TurboGetPos
und TurboFileLength sind in Assembler geschrieben und verhalten
sich genauso wie die Modula-Äquivalente, nur daß sie schneller
und kleiner sind und deshalb bevorzugt verwendet werden sollten.
Außerdem existieren noch die Prozeduren ReadChar, WriteChar,
ReadByteBlock und WriteByteBlock. Diese Prozeduren rufen nur
TurboRead und TurboWrite auf. Die Benutzung dieser Prozeduren
ist zwar in einigen Fällen bequem, durch den doppelten
Prozeduraufruf aber etwas langsamer als die direkte Benutzung
von TurboRead und TurboWrite.
Noch ein Hinweis: Wie schon gesagt, werden alle Prozeduraufrufe
außer CloseFile ignoriert, wenn f^.res einen Wert ungleich done
hat. In der Regel ist dann ein Fehler aufgetreten und man wird die
Datei schliessen. In einigen Fällen kann es aber sinnvoll sein,
die Datei weiter zu bearbeiten, beispielsweise wenn durch
Search oder TurboRead das Dateiende erreicht worden ist.
Man kann dann f^.res auf done zurücksetzen und versuchen
die Datei weiter zu bearbeiten.
Stefan Salewski, 17.7.89